package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICheckInPeopleDAO;
import org.jsola.hr.dto.CheckInPeopleAddDTO;
import org.jsola.hr.dto.CheckInPeopleUpdateDTO;
import org.jsola.hr.entity.CheckInPeopleDO;
import org.jsola.hr.query.CheckInPeopleQuery;
import org.jsola.hr.query.StatisicsPageEmpExportQuery;
import org.jsola.hr.vo.CheckInPeopleListVO;
import org.jsola.hr.vo.CheckInPeopleVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;


/**
 * 预登记人员
 *
 * @author zhr
 */
public interface ICheckInPeopleService extends IService<ICheckInPeopleDAO, CheckInPeopleDO> {

    /**
     * 预登记人员识别身份证
     *
     * @param checkInPeopleQuery 预登记人员查询参数
     * @param tokenUser          当前用户
     * @return CheckInPeopleListVO
     */
    CheckInPeopleListVO identificationCard(CheckInPeopleQuery checkInPeopleQuery, TokenUser tokenUser);

    /**
     * 批量修改人员状态
     *
     * @param checkInPeopleUpdateDTO 预登记人员
     * @param tokenUser              当前用户
     * @return 更新数量
     */
    Integer batchUpdate(CheckInPeopleUpdateDTO checkInPeopleUpdateDTO, TokenUser tokenUser);

    /**
     * 今日新增员工导出
     *
     * @param statisicsPageEmpExportQuery 导出参数
     * @param tokenUser                   当前用户
     * @return excel输入流
     */
    InputStream checkTodayAddExport(StatisicsPageEmpExportQuery statisicsPageEmpExportQuery, TokenUser tokenUser);

    /**
     * 新增预登记人员(校验不通过抛出异常)
     *
     * @param checkInPeopleAddDTO 新增预登记人员DTO
     * @param tokenUser           当前用户
     * @return 预登记人员详情信息
     */
    CheckInPeopleVO save(CheckInPeopleAddDTO checkInPeopleAddDTO, TokenUser tokenUser);

    /**
     * 新增预登记人员(校验不通过返回null)
     *
     * @param checkInPeopleAddDTO 新增预登记人员DTO
     * @param tokenUser           当前用户
     * @return 预登记人员详情信息
     */
    CheckInPeopleVO saveNoPE(CheckInPeopleAddDTO checkInPeopleAddDTO, TokenUser tokenUser);


    /**
     * 批量导入预登记人员
     *
     * @param file      需要解析的文件
     * @param tokenUser 当前登录用户
     * @return 记录导入失败的用户
     */
    List<CheckInPeopleVO> importCheckInPeople(File file, TokenUser tokenUser);


    /**
     * 修改预登记人员
     *
     * @param checkInPeopleUpdateDTO 修改预登记人员DTO
     * @param tokenUser              当前用户
     * @return 更新数量
     */
    int update(CheckInPeopleUpdateDTO checkInPeopleUpdateDTO, TokenUser tokenUser);

    /**
     * 修改预登记人员（null值会更新）
     *
     * @param checkInPeopleDO 预登记人员DO
     * @param tokenUser       当前用户
     * @return 更新数量
     */
    int updateIncludeNull(CheckInPeopleDO checkInPeopleDO, TokenUser tokenUser);


    /**
     * 批量删除预登记人员，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser        当前用户
     * @param checkInPeopleIds 预登记人员id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... checkInPeopleIds);

    /**
     * 根据手机号删除预登记人员，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser 当前用户
     * @param phone     手机号
     * @return 删除数量
     */
    int deleteByPhone(TokenUser tokenUser, String phone);


    /**
     * 根据预登记人员id查找
     *
     * @param checkInPeopleId 预登记人员id
     * @param siteId          所属站点id
     * @return 预登记人员详情信息
     */
    CheckInPeopleVO selectById(String checkInPeopleId, String siteId);

    /**
     * 查询预登记人员
     *
     * @param checkInPeopleQuery 查询条件
     * @param siteId             所属站点id
     * @return 预登记人员列表信息
     */
    List<CheckInPeopleListVO> select(CheckInPeopleQuery checkInPeopleQuery, String siteId);

    /**
     * 查询预登记人员记录数
     *
     * @param checkInPeopleQuery 查询条件
     * @param siteId             所属站点id
     * @return 预登记人员记录数
     */
    int selectCount(CheckInPeopleQuery checkInPeopleQuery, String siteId);

    /**
     * 查询预登记人员记录数,查询不到返回null
     *
     * @param channelIdList 渠道id
     * @param siteId        所属站点id
     * @return 预登记人员记录数
     */
    Map<String, Integer> selectCount(List<String> channelIdList, String siteId);

    /**
     * 分页查询预登记人员
     *
     * @param checkInPeopleQuery 查询条件
     * @param siteId             所属站点id
     * @return 预登记人员列表信息
     */
    Page<CheckInPeopleListVO> selectPage(CheckInPeopleQuery checkInPeopleQuery, String siteId);

    /**
     * 管理端小程序分页查询预登记人员
     *
     * @param checkInPeopleQuery 查询条件
     * @param tokenUser          当前用户
     * @return 预登记人员列表信息
     */
    Page<CheckInPeopleListVO> selectPageForMini(CheckInPeopleQuery checkInPeopleQuery, TokenUser tokenUser);

    /**
     * 根据预登记人员id查找
     *
     * @param checkInPeopleId 预登记人员id
     * @param siteId          所属站点id
     * @return 预登记人员
     */
    CheckInPeopleDO selectDOById(String checkInPeopleId, String siteId);

    /**
     * 查询预登记人员
     *
     * @param checkInPeopleQuery 查询条件
     * @param siteId             所属站点id
     * @return 预登记人员列表
     */
    List<CheckInPeopleDO> selectDO(CheckInPeopleQuery checkInPeopleQuery, String siteId);

    /**
     * 根据渠道id查询预登记人员
     *
     * @param channelId 渠道id
     * @param siteId    所属站点id
     * @return 预登记人员列表
     */
    List<CheckInPeopleDO> selectListByChannelId(String channelId, String siteId);

    /**
     * 赋值渠道名字
     *
     * @param checkInPeopleListVOList 预登记list
     * @param siteId                  站点id
     */
    void setChannelName(List<CheckInPeopleListVO> checkInPeopleListVOList, String siteId);

    /**
     * 设置预登记人员的入职时间及用工单位(最近一次的)
     *
     * @param checkInPeopleListVO 预登记人员对象
     * @param siteId              站点id
     */
    void setHireDateAndCompanyName(CheckInPeopleListVO checkInPeopleListVO, String siteId);

    /**
     * 根据手机号查询预登记人员
     *
     * @param phone  电话号码
     * @param siteId 所属站点id
     * @return 预登记人员 查询不到返回null
     */
    CheckInPeopleDO selectByPhone(String phone, String siteId);

    /**
     * 根据手机号列表查询预登记人员
     *
     * @param phoneList 电话号码列表
     * @param siteId    所属站点id
     * @return 预登记人员 查询不到返回null
     */
    List<CheckInPeopleDO> selectByPhoneList(List<String> phoneList, String siteId);

    /**
     * 根据姓名查询预登记人员
     *
     * @param name   电话号码
     * @param siteId 所属站点id
     * @return 预登记人员 查询不到返回null
     */
    CheckInPeopleDO selectByName(String name, String siteId);

    /**
     * 根据手机号查询预登记人员
     *
     * @param phones 电话号码
     * @param siteId 所属站点id
     * @return 预登记人员 查询不到返回null
     */
    List<CheckInPeopleDO> selectByPhones(List<String> phones, String siteId);

    /**
     * 导出预登记人员信息
     *
     * @param checkInPeopleQuery 查询条件
     * @param tokenUser          当前用户
     * @return 文件路径
     */
    String checkInPeopleExport(CheckInPeopleQuery checkInPeopleQuery, TokenUser tokenUser);

    /**
     * 查询租户下预登记人员数量
     *
     * @param tokenUser    当前用户
     * @param filterSource 过滤来源
     * @return 数量
     */
    Integer selectCountBySite(TokenUser tokenUser, String filterSource);
}


